diff options
| author | schererleander <leander@schererleander.de> | 2025-12-25 23:33:25 +0000 |
|---|---|---|
| committer | schererleander <leander@schererleander.de> | 2025-12-25 23:33:25 +0000 |
| commit | d82fb3b552d20a279efdd9408042183cfa02fb48 (patch) | |
| tree | 4ffe818e591e54da71f7592506c873abf0d9d481 /app/blog/[slug] | |
| parent | d7edbf05ab0e90eedcb99e4462e3a61793b2eff9 (diff) | |
initial commit
Diffstat (limited to 'app/blog/[slug]')
| -rw-r--r-- | app/blog/[slug]/page.tsx | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..a066779 --- /dev/null +++ b/app/blog/[slug]/page.tsx @@ -0,0 +1,35 @@ +// app/blog/[slug]/page.tsx +import { format, parseISO } from 'date-fns' +import { allPosts } from 'contentlayer/generated' +import { MDXContent } from '@/components/mdx-content' + +export const generateStaticParams = async () => allPosts.map((post) => ({ slug: post._raw.flattenedPath })) + +export const generateMetadata = async ({ params }: { params: Promise<{ slug: string }> }) => { + const { slug } = await params + const post = allPosts.find((post) => post._raw.flattenedPath === slug) + if (!post) throw new Error(`Post not found for slug: ${slug}`) + return { title: post.title } +} + +const PostLayout = async ({ params }: { params: Promise<{ slug: string }> }) => { + const { slug } = await params + const post = allPosts.find((post) => post._raw.flattenedPath === slug) + if (!post) throw new Error(`Post not found for slug: ${slug}`) + + return ( + <article className="mx-auto max-w-xl py-8"> + <div className="mb-8"> + <h1 className="text-3xl font-bold">{post.title}</h1> + <time dateTime={post.date} className="text-xs text-muted-foreground/60"> + {format(parseISO(post.date), 'LLLL d, yyyy')} + </time> + </div> + <div className="prose dark:prose-invert prose-neutral max-w-none [&>*]:mb-3 [&>*:last-child]:mb-0"> + <MDXContent code={post.body.code} /> + </div> + </article> + ) +} + +export default PostLayout |
